/*
 * @Description: Promise类中加入异步逻辑
 * @version: 
 * @Author: hui.wang01
 * @Date: 2020-12-23 14:27:27
 * @LastEditors: hui.wang01
 */

const PENDING = 'pending' //等待
const FULFILLED = 'fulfilled' // 成功解决
const REJECTED = 'rejected'  // 失败
class MyPromise {
  constructor(executor){
    executor(this.resolve, this.reject)
  }
  // promise状态    
  // tips: 这种定义属性的方式，在node10.13.0版本上不能正常运行， node 12.6.0可以正常运行！！！！
  status = PENDING

  // 成功后返回的值
  value = undefined

  // 失败的原因
  reason = undefined

  // 成功回调
  successCallback = undefined

  // 失败回调
  failCallback = undefined

  resolve = value => {
    // 如果状态不是等待 阻止程序向下执行
    if(this.status != PENDING) return 
    
    // 翻转promise状态
    this.status = FULFILLED    // tips: status要用this.status来访问！！
    
    //保存成功后的值
    this.value = value   // tips: value要用this.value来访问！！

    // 判断成功回调是否存在 如果存在 调用
    this.successCallback && this.successCallback(this.value)
  }

  reject = reason => {
    // 如果状态不是等待 阻止程序向下执行
    if(this.status != PENDING) return 

    //翻转promise状态
    this.status = REJECTED
    
    // 保存失败原因
    this.reason = reason // tips: reason要用this.reason来访问！！

    // 判断失败回调是否存在 如果存在 调用
    this.failCallback && this.failCallback(this.reason)
  }

  then = (successCallback, failCallback) => {
    if(this.status == FULFILLED){ //执行成功回调
      successCallback(this.value)
    } else if(this.status == REJECTED) {
      failCallback(this.reason)
    } else {
      // 保存回调函数
      this.successCallback = successCallback 
      this.failCallback = failCallback
    }
  }
}

module.exports = MyPromise